package cn.iocoder.yudao.module.reading.service.follow;

import cn.iocoder.yudao.module.reading.controller.app.follow.vo.FollowUserRespVO;

import java.util.List;
import java.util.Map;

/**
 * 关注系统 Service 接口
 *
 * @author 李晨
 */
public interface FollowService {

    /**
     * 关注用户
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     * @return 关注记录ID
     */
    Long followUser(Long followerId, Long followeeId);

    /**
     * 取消关注用户
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     */
    void unfollowUser(Long followerId, Long followeeId);

    /**
     * 切换关注状态
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     * @return 操作后的关注状态（true-已关注，false-未关注）
     */
    boolean toggleFollow(Long followerId, Long followeeId);

    /**
     * 屏蔽用户
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     */
    void blockUser(Long followerId, Long followeeId);

    /**
     * 取消屏蔽用户
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     */
    void unblockUser(Long followerId, Long followeeId);

    /**
     * 检查是否已关注
     *
     * @param followerId 关注者用户ID
     * @param followeeId 被关注者用户ID
     * @return 是否已关注
     */
    boolean isFollowing(Long followerId, Long followeeId);

    /**
     * 检查是否互相关注
     *
     * @param userId1 用户1ID
     * @param userId2 用户2ID
     * @return 是否互相关注
     */
    boolean isMutualFollow(Long userId1, Long userId2);

    /**
     * 批量检查关注状态
     *
     * @param followerId  关注者用户ID
     * @param followeeIds 被关注者用户ID列表
     * @return 关注状态Map，key为用户ID，value为是否已关注
     */
    Map<Long, Boolean> batchCheckFollowStatus(Long followerId, List<Long> followeeIds);

    /**
     * 获取关注列表
     *
     * @param followerId 关注者用户ID
     * @param limit      限制数量
     * @return 关注用户列表
     */
    List<FollowUserRespVO> getFollowingList(Long followerId, Integer limit);

    /**
     * 获取粉丝列表
     *
     * @param followeeId 被关注者用户ID
     * @param limit      限制数量
     * @return 粉丝用户列表
     */
    List<FollowUserRespVO> getFollowerList(Long followeeId, Integer limit);

    /**
     * 获取互相关注列表
     *
     * @param userId 用户ID
     * @param limit  限制数量
     * @return 互相关注用户列表
     */
    List<FollowUserRespVO> getMutualFollowList(Long userId, Integer limit);

    /**
     * 统计关注数量
     *
     * @param followerId 关注者用户ID
     * @return 关注数量
     */
    Long countFollowing(Long followerId);

    /**
     * 统计粉丝数量
     *
     * @param followeeId 被关注者用户ID
     * @return 粉丝数量
     */
    Long countFollowers(Long followeeId);

    /**
     * 获取用户关注统计信息
     *
     * @param userId 用户ID
     * @return 关注统计信息
     */
    FollowStatsVO getFollowStats(Long userId);

    /**
     * 关注统计信息VO
     */
    interface FollowStatsVO {
        /**
         * 关注数量
         */
        Integer getFollowingCount();

        /**
         * 粉丝数量
         */
        Integer getFollowerCount();

        /**
         * 互相关注数量
         */
        Integer getMutualFollowCount();
    }

}
